package main

import "fmt"
import "math"

func main() {
	fmt.Println("Hello, World!")
	a, b, c, d := 071, 0x1F, 1e9, math.MinInt16
	fmt.Println(a, b, c, d) // 57 31 1e+09 -32768
	s1 := `
	第一行
    第二行
    第三行
    `
    fmt.Println(s1)
	changeString()
	sqrtDemo()

	var arr0 [5]int = [5]int{1, 2, 3} // 1 2 3 0 0
	var arr1 = [5]int{1, 2, 3, 4, 5} // 1 2 3 4 5
	var arr2 = [...]int{1, 2, 3, 4, 5, 6} // 1 2 3 4 5 6
	var str = [5]string{3: "hello world", 4: "tom"} // [   hello world tom] 三个空格
	var arr3 [5]int = [5]int{} // 0 0 0 0 0
	e := [...]struct {
		name string
		age  uint8
	}{
		{"user1", 10}, // 可省略元素类型。
		{"user2", 20}, // 别忘了最后一行的逗号。
	}
	fmt.Println(arr0, arr1, arr2, str, arr3, e)

	var arr4 [5]int
    printArr(&arr4)
    fmt.Println(arr4)
    arr5 := [...]int{2, 4, 6, 8, 10}
    printArr(&arr5)
    fmt.Println(arr5)

	//1.声明切片
	var s7 []int
	if s7 == nil {
	   fmt.Println("是空")
	} else {
	   fmt.Println("不是空")
	}
	// 2.:=
	s2 := []int{}
	// 3.make()
	var s3 []int = make([]int, 0)
	fmt.Println(s7, s2, s3)
	// 4.初始化赋值
	var s4 []int = make([]int, 0, 0)
	fmt.Println(s4)
	s5 := []int{1, 2, 3}
	fmt.Println(s5)
	// 5.从数组切片
	arr := [5]int{1, 2, 3, 4, 5}
	var s6 []int
	// 前包后不包
	s6 = arr[1:4]
	fmt.Println(s6)
}

func changeString() {
    s1 := "hello"
    // 强制类型转换
    byteS1 := []byte(s1)
    byteS1[0] = 'H'
    fmt.Println(string(byteS1))

    s2 := "博客"
    runeS2 := []rune(s2)
    runeS2[0] = '狗'
    fmt.Println(string(runeS2))
}

func sqrtDemo() {
    var a, b = 3, 4
    var c int
    // math.Sqrt()接收的参数是float64类型，需要强制转换
    c = int(math.Sqrt(float64(a*a + b*b)))
    fmt.Println(c)
}

func printArr(arr *[5]int) {
    arr[0] = 10
    for i, v := range arr {
        fmt.Println(i, v)
    }
}